package com.sxpi.user.service.useramount;

import com.sxpi.common.result.R;
import com.sxpi.user.vo.UserAmountVo;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * @Author: 董伟豪
 * @Date: 2022/11/8 21:30
 */
public interface IUserAmountRecordService {

    /**
     * 体现方法---无锁
     * @param userAmountVo
     * @return
     */
    R takeMoney(UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - 悲观锁
     * @return
     * @paramp loginVo
     */
    R takeMoneyPessimismLock(UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - 乐观锁
     * @return
     * @paramp loginVo
     */
    R takeMoneyOptimismLock(UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - redis不可重入
     * @return
     * @paramp loginVo
     */
    R takeMoneyRedisLock(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - zookeeper可重入
     * @return
     * @paramp loginVo
     */
    R takeMoneyZookeeperLock(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - redisson可重入
     * @return
     * @paramp loginVo
     */
    R takeMoneyRedissonLock(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - redisson不可重入
     * @return
     * @paramp loginVo
     */
    R takeMoneyRedissonTryLock(@RequestBody UserAmountVo userAmountVo);
}
